package com.zz.fileoperatelib;

import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;

import java.io.OutputStream;

/**
 * @author: zhuozhang6
 * @date: 2021/12/21
 * @email: zhuozhang6@iflytek.com
 * @Description: 在 Android 11 上运行但以 Android 10（API 级别 29）为目标（targetsdk）平台的应用仍可请求 requestLegacyExternalStorage 属性
 * Android 11 为目标平台后，系统会忽略 requestLegacyExternalStorage 标记
 * 所以Android 11 后必须通过contentResolver.insert等形式操作文件
 * Android 11 版本，外部共有存储时，只能通过contentResolver将文件存储在
 */
public class FileOperateUtil {

    private static FileOperateUtil sInstance = new FileOperateUtil();

    private FileOperateUtil() {
    }

    public static FileOperateUtil getInstance() {
        return sInstance;
    }

    /**
     * 图片 MediaStore.Images
     * targetsdk 30，时图片在外部共有存储只能存储在 DCIM/ 和 Pictures/ 目录中。系统将这些文件添加到 MediaStore.Images 表格中
     *
     * @param context
     */
    public void insertImage(Context context) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, "aaa.jpeg");//必选
        contentValues.put(MediaStore.Images.ImageColumns.TITLE, "aaatitle.jpeg");//可选
        contentValues.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/jpeg");
        contentValues.put(MediaStore.Images.ImageColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/SafTest/");
        Uri imageUri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        //设置了文件夹SafTest和文件aaa.jpeg，进行insert操作之后，会在/storage/emulated/0/Pictures/下新建SafTest文件夹，但是不会新建出aaa.jpeg的文件
        //在下面通过outputStream给aaa.jpeg写入数据后，aaa.jpeg才会被新建
        OutputStream outputStream = null;
        try {
            outputStream = context.getContentResolver().openOutputStream(imageUri);
            Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.die);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.e("eeeeee", "添加图片成功");
    }

    /**
     * 视频 MediaStore.Video
     * targetsdk 30，时视频在外部共有存储只能存储在 DCIM/、Movies/ 和 Pictures/ 目录中。系统将这些文件添加到 MediaStore.Video 表格中
     *
     * @param context
     */
    public void insertVideo(Context context) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Video.VideoColumns.DISPLAY_NAME, "aaa.mp4");
        contentValues.put(MediaStore.Video.VideoColumns.TITLE, "aaatitle.mp4");
        contentValues.put(MediaStore.Video.VideoColumns.MIME_TYPE, "image/jpeg");
        contentValues.put(MediaStore.Video.VideoColumns.RELATIVE_PATH, Environment.DIRECTORY_MOVIES + "/SafTest/");
        Uri videoUri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, contentValues);
    }

    /**
     * 音频 MediaStore.Audio
     * targetsdk 30，时音频在外部共有存储只能存储在 Alarms/、Audiobooks/、Music/、Notifications/、Podcasts/ 和 Ringtones/ 目录中，
     * 以及位于 Music/ 或 Movies/ 目录中的音频播放列表中。系统将这些文件添加到 MediaStore.Audio 表格中。
     *
     * @param context
     */
    public void insertAudio(Context context) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Audio.AudioColumns.DISPLAY_NAME, "aaa.mp3");
        contentValues.put(MediaStore.Audio.AudioColumns.MIME_TYPE, "image/jpeg");
        contentValues.put(MediaStore.Audio.AudioColumns.RELATIVE_PATH, Environment.DIRECTORY_MUSIC + "/SafTest/");
        Uri imageUri = context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues);
    }

    /**
     * 下载的文件 MediaStore.Downloads
     * targetsdk 30，时音频在外部共有存储只能存储在 Download/ 目录中。在搭载 Android 10（API 级别 29）及更高版本的设备上才有此API，
     * 这些文件存储在 MediaStore.Downloads 表格中。此表格在 Android 9（API 级别 28）及更低版本中不可用。
     *
     * @param context
     */
    public void insertDownload(Context context) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "QQ.apk");
        contentValues.put(MediaStore.Downloads.MIME_TYPE, "application/vnd.android.package-archive");
        contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + "/SafTest/");
        Uri downUri = context.getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues);
    }

    /**
     * 所有文件 MediaStore.Files
     * 其内容取决于您的应用是否使用分区存储（适用于以 Android 10 或更高版本为目标平台的应用）：
     * 如果启用了分区存储，集合只会显示您的应用创建的照片、视频和音频文件。
     * 如果分区存储不可用或未使用，集合将显示所有类型的媒体文件。
     *
     * @param context
     */
    public void insertFiles(Context context) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "论文.doc");
        contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOCUMENTS + "/SafTest/");
        contentValues.put(MediaStore.Downloads.TITLE, "论文title");
        Uri fileUri = context.getContentResolver().insert(MediaStore.Files.getContentUri("external"), contentValues);

        OutputStream outputStream = null;
        try {
            outputStream = context.getContentResolver().openOutputStream(fileUri);
            String msg = "这是要写入文件的一条信息";
            outputStream.write(msg.getBytes());
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.e("eeeeee", "添加图片成功");

    }


}
